package controller

import (
	"devops/code"
	"devops/controller/validation"
	"devops/service"
	"sort"

	"github.com/gin-gonic/gin"
)

// @Summary 获取构建计划的环境变量
// @Tags 环境变量
// @Produce  json
// @Param	param  query  validation.GetCiEnvs  true    "传入参数"
// @Success 200 {object} data.SuccessGetCiEnvs  		"成功返回"
// @Failure 10000 {object} data.ParamError     			"错误返回"
// @Router /api/ci/env/all [get]
func GetCiEnvs(c *gin.Context) {
	var param validation.GetCiEnvs
	if err := c.ShouldBind(&param); err != nil {
		ErrorResponse(c, code.PARAMETER_ERR, err.Error())
		return
	}
	devops := service.NewDevOps()
	envs := devops.GetCiEnvs(param.CID)
	SuccessResponse(c, envs)
}

// @Summary 根据ID查找环境变量
// @Tags 环境变量
// @Produce  json
// @Param	param  query  validation.GetCiEnv  true    "传入参数"
// @Success 200 {object} data.SuccessGetCiEnv  		"成功返回"
// @Failure 10000 {object} data.ParamError     			"错误返回"
// @Router /api/ci/env/one [get]
func GetCiEnv(c *gin.Context) {
	var param validation.GetCiEnv
	if err := c.ShouldBind(&param); err != nil {
		ErrorResponse(c, code.PARAMETER_ERR, err.Error())
		return
	}
	devops := service.NewDevOps()
	env := devops.GetCiEnv(param.EnvID)
	SuccessResponse(c, env)
}

// @Summary 新增环境变量
// @Tags 环境变量
// @Produce  json
// @Param	param  body  validation.CreateCIEnv  true      "传入参数"
// @Success 200 {object} data.SuccessCreateCI  			"成功返回"
// @Failure 10000 {object} data.ParamError     			"错误返回"
// @Failure 11000 {object} data.FailCreateCI     		"错误返回"
// @Router /api/ci/env/create [post]
func CreateCIEnv(c *gin.Context) {
	var param validation.CreateCIEnv
	if err := c.ShouldBind(&param); err != nil {
		ErrorResponse(c, code.PARAMETER_ERR, err.Error())
		return
	}
	devops := service.NewDevOps()
	err := devops.CreateCIEnv(param)
	if err != nil {
		ErrorResponse(c, code.CREATE_FAIL, err.Error())
		return
	}
	SuccessResponse(c, "创建成功")
}

// @Summary 编辑环境变量
// @Tags 环境变量
// @Produce  json
// @Param	param  body  validation.UpdateCIEnv  true      "传入参数"
// @Success 200 {object} data.SuccessUpdateCiEnv  			"成功返回"
// @Failure 10000 {object} data.ParamError     			"错误返回"
// @Failure 11002 {object} data.FailUpdateCiEnv      		"错误返回"
// @Router /api/ci/env/update [post]
func UpdateCiEnv(c *gin.Context) {
	var param validation.UpdateCIEnv
	if err := c.ShouldBind(&param); err != nil {
		ErrorResponse(c, code.PARAMETER_ERR, err.Error())
		return
	}
	devops := service.NewDevOps()
	err := devops.UpdateCiEnv(param)
	if err != nil {
		ErrorResponse(c, code.UPDATE_FAIL, err.Error())
		return
	}
	SuccessResponse(c, "更新成功")
}

// @Summary 删除环境变量
// @Tags 环境变量
// @Produce  json
// @Param	param  body  validation.DeleteCIEnv  true      "传入参数"
// @Success 200 {object} data.SuccessDeleteCI  			"成功返回"
// @Failure 10000 {object} data.ParamError     			"错误返回"
// @Failure 11001 {object} data.FailDeleteCI     		"错误返回"
// @Router /api/ci/env/delete [post]
func DeleteCIEnv(c *gin.Context) {
	var param validation.DeleteCIEnv
	if err := c.ShouldBind(&param); err != nil {
		ErrorResponse(c, code.PARAMETER_ERR, err.Error())
		return
	}
	devops := service.NewDevOps()
	err := devops.DeleteCIEnv(param.EnvID)
	if err != nil {
		ErrorResponse(c, code.DELETE_FAIL, err.Error())
		return
	}
	SuccessResponse(c, "删除成功")
}

// @Summary 获取旧的构建设置
// @Tags 其他高级设置
// @Produce  json
// @Param	query  query  validation.GetDiscarder  true      "传入参数"
// @Success 200 {object} data.SuccessGetDiscarder  			"成功返回"
// @Failure 10000 {object} data.ParamError     			"错误返回"
// @Router /api/ci/setting/discarder [get]
func GetDiscarder(c *gin.Context) {
	var param validation.GetDiscarder
	if err := c.ShouldBind(&param); err != nil {
		ErrorResponse(c, code.PARAMETER_ERR, err.Error())
		return
	}
	devops := service.NewDevOps()
	SuccessResponse(c, devops.GetDiscarder(param.CID))
}

// @Summary 更改旧的构建设置
// @Tags 其他高级设置
// @Produce  json
// @Param	param  body  validation.SetDiscarder  true      "传入参数"
// @Success 200 {object} data.SuccessSetDiscarder  			"成功返回"
// @Failure 10000 {object} data.ParamError     			"错误返回"
// @Failure 11002 {object} data.FailSetDiscarder     			"错误返回"
// @Router /api/ci/setting/discarder/set [post]
func SetDiscarder(c *gin.Context) {
	var param validation.SetDiscarder
	if err := c.ShouldBind(&param); err != nil {
		ErrorResponse(c, code.PARAMETER_ERR, err.Error())
		return
	}
	devops := service.NewDevOps()
	err := devops.SetDiscarder(param)
	if err != nil {
		ErrorResponse(c, code.UPDATE_FAIL, err.Error())
		return
	}
	SuccessResponse(c, "设置成功")
}

// @Summary 获取定时构建信息
// @Tags 其他高级设置
// @Produce  json
// @Param	query  query  validation.GetDiscarder  true      "传入参数"
// @Success 200 {object} data.SuccessGetTiming  			"成功返回"
// @Failure 10000 {object} data.ParamError     			"错误返回"
// @Router /api/ci/setting/timing [get]
func GetTiming(c *gin.Context) {
	var param validation.GetDiscarder
	if err := c.ShouldBind(&param); err != nil {
		ErrorResponse(c, code.PARAMETER_ERR, err.Error())
		return
	}
	devops := service.NewDevOps()
	SuccessResponse(c, devops.GetTiming(param.CID))
}

// @Summary 更改定时构建信息
// @Tags 其他高级设置
// @Produce  json
// @Param	param  body  validation.SetTiming  true      "传入参数"
// @Success 200 {object} data.SuccessSetTiming  			"成功返回"
// @Failure 10000 {object} data.ParamError     			"错误返回"
// @Failure 11002 {object} data.FailSetTiming     			"错误返回"
// @Router /api/ci/setting/timing/set [post]
func SetTiming(c *gin.Context) {
	var param validation.SetTiming
	if err := c.ShouldBind(&param); err != nil {
		ErrorResponse(c, code.PARAMETER_ERR, err.Error())
		return
	}
	sort.Ints(param.Week)
	// 边界检查
	if param.Week[0] < 1 || param.Week[len(param.Week)-1] > 7 {
		ErrorResponse(c, code.PARAMETER_ERR, "包含不存在的星期")
		return
	}
	devops := service.NewDevOps()
	err := devops.SetTiming(param)
	if err != nil {
		ErrorResponse(c, code.UPDATE_FAIL, err.Error())
		return
	}
	SuccessResponse(c, "设置成功")
}
